<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>登陆页</title>
</head>
<body>
<h1>欢迎登陆</h1>
<div>
    <div th:if="${error}">
        <div th:text="${error}"></div>
    </div>
<!--
这个登录页需要关注的事情就是表单提交到了什么地方以及用户名和密码输入域的名称。
默认情况下，Spring Security会在“/login”路径监听登录请求并且预期的用户名和密码输入域的名称为username和password。
但这都是可配置的，举例来说，如下的配置自定义了路径和输入域的名称：
-->
    <form method="post" th:action="${loginProcessingUrlAddress}">
        <input name="username">
        <br/>
        <input name="password">

        <br>
<!--

跨站请求伪造（Cross-Site Request Forgery，CSRF）是一种常见的安全攻击。
它会让用户在一个恶意的Web页面上填写信息，然后自动（通常是秘密的）将表单以攻击受害者的身份提交到另外一个应用上。
例如，用户看到一个来自攻击者的Web站点的表单，
这个站点会自动将数据POST到用户银行Web站点的URL上
（这个站点可能设计得很糟糕，无法防御这种类型的攻击），实现转账的操作。
用户可能根本不知道发生了攻击，直到他们发现账号上的钱已经不翼而飞。

为了防止这种类型的攻击，应用可以在展现表单的时候生成一个CSRF token，并放到隐藏域中，
然后将其临时存储起来，以便后续在服务器上使用。
在提交表单的时候，token将和其他的表单数据一起发送至服务器端。
请求会被服务器拦截，并与最初生成的token进行对比。
如果token匹配，那么请求将会允许处理；否则，表单肯定是由恶意网站渲染的，
因为它不知道服务器所生成的token。


比较幸运的是，Spring Security提供了内置的CSRF保护。
更幸运的是，默认它就是启用的，我们不需要显式配置它。
我们唯一需要做的就是确保应用中的每个表单都要有一个名为“_csrf”的字段，
它会持有CSRF token。
Spring Security甚至进一步简化了将token放到请求的“_csrf”属性中这一任务。
在Thymeleaf模板中，我们可以按照如下的方式在隐藏域中渲染CSRF token：

如果你使用Spring MVC的JSP标签库或者Spring Security的Thymeleaf方言，
那么甚至都不用明确包含这个隐藏域（这个隐藏域会自动生成）。

在Thymeleaf中，我们只需要确保<form>的某个属性带有Thymeleaf属性前缀即可。
通常这并不是什么问题，因为我们一般会使用Thymeleaf渲染相对于上下文的路径。
例如，为了让Thymeleaf渲染隐藏域，我们只需要使用th:action属性就可以了：
-->
        <input name="_csrf" type="hidden" th:value="${_csrf.getToken()}">

        <button type="submit">登陆</button>
    </form>
</div>
</body>
</html>